package com.wakaca.design.pattern.behavioral.templatemethod;

/**
 * 抽象工厂类，模版方法类
 * Created by wakaca
 */
public abstract class ACourse {
    protected final void makeCourse(){
        this.makePPT();
        this.makeVideo();
        if(needWriteArticle()){
            this.writeArticle();
        }
        this.packageCourse();
    }

    // 这三个方法是固定不变的
    final void makePPT(){
        System.out.println("制作PPT");
    }
    final void makeVideo(){
        System.out.println("制作视频");
    }
    final void writeArticle(){
        System.out.println("编写手记");
    }

    // 钩子方法，写手记并不是一个非必选项，完全留给子类来扩展
    // 让子类可以对算法的不同点进行选择或挂钩，要不要挂钩由子类决定
    protected boolean needWriteArticle(){
        return false;
    }
    abstract void packageCourse(); // 包装课程
}
